/**
 * underscore 库unique 数组去重的写法
 */

 /**
  * underscore库数组去重
  * @param {*} array 
  * @param {*} isSorted  是否已经拍好序 若排好序 使用更快的排序方式
  * @param {*} iteratee ：传入一个函数，可以对每个元素进行重新的计算，然后根据处理的结果进行去重
  */
 var array = [1, 1, 'a', 'A', 2, 2];
 function unique(array,isSorted,iteratee){
   let res = [];
   let seen = [];
   for(let i=0;i<array.length;i++){
     const value = array[i];
     const computed = iteratee ? iteratee(value,i,array) : value;
     if(isSorted){
        if(!i || seen !== computed){
           res.push(value);
        }
        seen = computed;
     }else if(iteratee){
       if(seen.indexOf(computed) === -1){
          res.push(value);
          seen.push(computed);
       }
     }else if(res.indexOf(value) === -1){
         res.push(value);
     }
   }
   return res;
 }
 console.log(unique(array,false,function(item){
   return typeof item === 'string' ? item.toLowerCase() : item;
 }));

 /**
  * 使用objct键值对去重
  */
 var array2 = [{value: 1}, {value: 1}, {value: 2}];
 function unique2(array){
   let obj = {};
   let arr = array.filter((item,index)=>{
      let tag = typeof item + JSON.stringify(item);
      return obj.hasOwnProperty(tag) ? false : (obj[tag] = true);
   })
   return arr;
 }
 console.log(unique2(array2));
/**
 * ES6去重
 * 使用set
 * 也可以使用 map的写法
 */
var array3 = [1,3,4,3,NaN,NaN];
function unique3(array) {
  return [...new Set(array)];
}
function unique4(arr) {
  const seen = new Map()
  return arr.filter((a) => !seen.has(a) && seen.set(a, 1))
}
console.log(unique3(array3));